package com.gsd.swagger.config;

import com.gsd.swagger.anno.MyAnnotation4Swagger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

import  com.google.common.base.Predicates;
import  springfox.documentation.builders.RequestHandlerSelectors;

@Configuration
public class SwaggerConfiguration {

    /**
     * 创建Docket类型对象。并使用Spring容器管理。
     * Docket是Swagger中的全局配置对象。
     * @return
     */
    @Bean
    public Docket docket(){
        Docket docket=new Docket(DocumentationType.SWAGGER_2);
        //api帮助文档的描述信息。
        ApiInfo apiInfo =new ApiInfoBuilder().contact(
                new Contact("郭首都",//是文档的发布者
                        "http://www.baidu.com",//文档发布者的网站地址
                        "gsd21@qq.com")//文档发布者的电子邮箱
        ).title("Swagger框架帮助文档详细描述")
                .description("Swagger框架学习帮助文档详细描述-Swagger框架是一个用于开发RestApi帮助文档")
                .version("1.1")
                .build();
        //给docket上下配置api描述信息
        docket.apiInfo(apiInfo);
        docket= docket.select() //获取Docket中的选择器，返回apiseletorbuilder。构建选择器，如扫描什么包的注解。
               .apis(
                       Predicates.and(
                               Predicates.not(//取反。false -> true  true->false
                                       RequestHandlerSelectors.withMethodAnnotation( //当方法上有注解的时候返回true
                                               MyAnnotation4Swagger.class) //方法上有什么注解的时候返回true
                               )
                              // ,RequestHandlerSelectors.basePackage("com.gsd.swagger.controller")
                       )

               )
                .apis(RequestHandlerSelectors.basePackage("com.gsd.swagger.controller"))//设定扫描那个包
                .paths(
                        Predicates.or( //多个规则符合任意一个即可通过。
                                PathSelectors.regex("/swagger/.*" ) , //使用正则表达式，约束生成API文档的路径地址。
                                PathSelectors.regex("/swagg2er/.*" ),
                                PathSelectors.regex("/.*" )
                        )
                )
                .build();//重新构建Docket对象。
        return docket;
    }
}
